home *** CD-ROM | disk | FTP | other *** search
- 2 '***********************************************************************
- 4 '* FOURIER SMOOTHING WITHOUT THE FAST FOURIER TRANSFORM PROGRAM *
- 6 '* By Eric E. Aubanel and Keith B. Oldham *
- 8 '***********************************************************************
- 10 CLS
- 12 INPUT "ENTER NUMBER OF DATA POINTS";N
- 14 REM LEAVING R AND I ARRAYS UNDIMENSIONED LIMITS VALID VALUES OF E TO <=10
- 16 DIM X(N),X1(N),U(N),V(N)
- 18 FOR I=0 TO N-1
- 20 INPUT "ENTER DATAPOINT VALUE";X(I)
- 22 NEXT I
- 24 GOSUB 60
- 26 PRINT "THE SMOOTHED DATA VALUES ARE:"
- 28 FOR I=0 TO N-1
- 30 PRINT "X(";I+1;") = ";X1(I)
- 32 NEXT I
- 34 END
- 36 REM FOURIER ALGORITHM SUBROUTINE BEGINS AT LINE 60. LINE NUMBERS ARE THE SAME AS FOR THE HP VERSION OF THE SUBROUTINE
- 60 PI=3.141593
- 70 PRINT "NUMBER OF TRANSFORM POINTS TO BE KEPT";
- 80 INPUT E
- 90 IF E>INT((N+1)/2) THEN PRINT "E TOO LARGE":GOTO 70
- 100 IF E<>INT(E) OR E<=1 THEN GOTO 70
- 110 IF E<=Q THEN 870
- 120 REM
- 130 IF Q<>0 THEN 330
- 240 'CALCULATE R(0)
- 250 G=0
- 260 FOR J=0 TO N-1
- 280 G=G+X(J)
- 290 NEXT J
- 300 R(0)=G/N
- 310 Q=1
- 320 REM
- 330 PRINT "WORKING ON R(K) TRANSFORM CALCULATIONS"
- 340 J2=INT((N-1)/2)
- 350 P1=INT(LOG(2*J2-1)/LOG(2))
- 360 FOR K=Q TO E-1
- 370 J1=J2
- 380 S=PI*K*2/N
- 390 C=COS(S):S=SIN(S)
- 400 FOR J=1 TO J1
- 410 L=2*J-1
- 420 U(J)=X(L)*C+X(L+1)
- 430 V(J)=X(L)*S
- 440 NEXT J
- 450 S=2*S*C:C=2*C*C-1
- 460 FOR P=1 TO P1
- 470 U(J1+1)=0:V(J1+1)=0
- 480 J1=INT((J1+1)/2)
- 490 FOR J=1 TO J1
- 500 L=2*J-1
- 510 U=U(L)*C-V(L)*S+U(L+1)
- 520 V(J)=U(L)*S+V(L)*C+V(L+1)
- 530 U(J)=U
- 540 NEXT J
- 550 S=2*S*C:C=2*C*C-1
- 560 NEXT P
- 570 R(K)=(X(0)+(U(1)*C+V(1)*S))/N
- 580 NEXT K
- 590 REM
- 600 PRINT "WORKING ON I(K) TRANSFORM CALCULATIONS"
- 610 FOR K=Q TO E-1
- 620 J1=J2
- 630 S=2*PI*K/N
- 640 C=COS(S):S=SIN(S)
- 650 FOR J=1 TO J1
- 660 L=2*J-1
- 670 U(J)=-(X(L)*S)
- 680 V(J)=X(L)*C+X(L+1)
- 690 NEXT J
- 700 S=2*S*C:C=2*C*C-1
- 710 FOR P=1 TO P1
- 720 U(J1+1)=0:V(J1+1)=0
- 730 J1=INT((J1+1)/2)
- 740 FOR J=1 TO J1
- 750 L=2*J-1
- 760 U=U(L)*C-V(L)*S+U(L+1)
- 770 V(J)=U(L)*S+V(L)*C+V(L+1)
- 780 U(J)=U
- 790 NEXT J
- 800 S=2*S*C:C=2*C*C-1
- 810 NEXT P
- 820 I(K)=-((U(1)*C+V(1)*S)/N)
- 830 NEXT K
- 840 REM
- 850 IF E>Q THEN Q=E
- 860 REM
- 870 PRINT "WORKING ON INVERSE TRANSFORM"
- 880 REM
- 890 'CALCULATE X1(0)
- 900 F1=0:F2=0
- 910 FOR K=1 TO E-1
- 920 T=R(K)
- 930 F1=F1+T
- 940 F2=F2+K*K*T
- 950 NEXT K
- 960 X1(0)=R(0)+2*(F1-F2*(1/E/E))
- 980 REM
- 990 P1=INT(LOG(2*E-3)/LOG(2))
- 1000 FOR J=1 TO N-1
- 1010 T2=E*E
- 1020 FOR K=1 TO E-1
- 1030 F=1-K*K/T2
- 1040 U(K)=R(K)*F:V(K)=-(I(K)*F)
- 1050 NEXT K
- 1060 K1=E-1
- 1070 S=2*PI*J/N
- 1080 C=COS(S):S=SIN(S)
- 1090 FOR P=1 TO P1
- 1100 U(K1+1)=0:V(K1+1)=0
- 1110 K1=INT((K1+1)/2)
- 1120 FOR K=1 TO K1
- 1130 L=2*K-1
- 1140 U=U(L)*C-V(L)*S+U(L+1)
- 1150 V(K)=U(L)*S+V(L)*C+V(L+1)
- 1160 U(K)=U
- 1170 NEXT K
- 1180 S=2*S*C:C=2*C*C-1
- 1190 NEXT P
- 1200 X1(J)=R(0)+2*(U(1)*C+V(1)*S)
- 1220 NEXT J
- 1230 RETURN
-